package com.terry.test3;

import java.util.Scanner;

/**
 * 仿 LISP 运算
 * 题目描述：
 * LISP 语言唯一的语法就是括号要配对。 形如(OP P1 P2 …)，括号内元素由单个空格分割。 其中第一个
 * 元素 OP 为操作符，后续元素均为其参数，参数个数取决于操作符类型 注意：参数 P1, P2 也有可能是另外
 * 一个嵌套的(OP P1 P2 …) 当前 OP 类型为 add / sub / mul / div（全小写），分别代表整数的加减乘除法
 * 简单起见，所有 OP 参数个数均为 2
 * 举例:
 * 输入：(mul 3 -7) 输出： -21
 * 输入：(add 1 2) 输出：3
 * 输入：(sub (mul 2 4) (div 9 3)) 输出：5
 * 输入：(div 1 0) 输出：error 题目涉及数字均为整数，可能为负；
 * 不考虑 32 位溢出翻转，计算过程中也不会发生 32 位溢出翻转 除零错误时，
 * 输出 “error”，除法遇除不尽，向下取整，即 3 / 2 = 1
 * 输入描述：
 * 输入为长度不超过 512 的字符串，用例保证了无语法错误
 * 输出描述：
 * 输出计算结果或者“error”
 * 示例 1
 * 输入：(div 12 (sub 45 45))
 * 输出：
 * error
 *
 * @author 小八
 * @date 2023年02月08日11:40
 */
public class Title3 {

    public static boolean isError = false;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()){
            String line = in.nextLine();
            isError = false ;
            int value = lisp(line);
            if(isError){
                System.out.print("Error");
            }else{
                System.out.print(value);
            }
        }
    }


    public static int lisp(String line){
        int len = line.length();
        if(line.charAt(0) != '(' || line.charAt(len-1)!=')'){
            isError = true;
            return -1;
        }
        String op = line.substring(1, 4);
        int opNum1,opNum2 ;
        String leftLine =  line.substring(5,len-1);
        char[] arr = leftLine.toCharArray();
        int index = 0;
        while((arr[index]>='0' && arr[index]<='9') || arr[index] == '-'){
            index++;
        }
        if(index > 0){
            opNum1 = Integer.parseInt(leftLine.substring(0,index));
        }else {
            int lk = 0;
            int rk = 0;
            while (index < leftLine.length()) {
                if (arr[index] == '(') {
                    lk++;
                } else if (arr[index] == ')') {
                    rk++;
                }
                index++;
                if (lk == rk && lk > 0) {
                    break;
                }
            }
            opNum1 = lisp(leftLine.substring(0, index));
        }

        //查询第二个值
        int tempIndex = index+1 ;
        while(tempIndex<=leftLine.length()-1 &&((arr[tempIndex]>='0' && arr[tempIndex]<='9') || arr[tempIndex] == '-')){
            tempIndex++;
        }
        if(tempIndex>index+1){
            opNum2 = Integer.parseInt(leftLine.substring(index+1,tempIndex));
        }else{
            //去除调空格
            opNum2 = lisp(leftLine.substring(index+1));
        }


        switch (op){
            case "mul":
                return opNum1*opNum2;
            case "add":
                return opNum1 + opNum2 ;
            case "sub":
                return opNum1 - opNum2 ;
            case "div":
                if(opNum2 == 0){
                    isError = true ;
                    return 0;
                }
                if((opNum1^opNum2) < 0 && opNum1%opNum2 != 0){
                    return  opNum1/opNum2 + 1;
                }
                return opNum1/opNum2;
        }
        return 0;
    }

//    public static int lisp(String line){
//        int len = line.length();
//        if(line.charAt(0) != '(' || line.charAt(len-1)!=')'){
//            isError = true;
//            return -1;
//        }
//        String op = line.substring(1, 4);
//        int opNum1,opNum2 ;
//        String leftLine =  line.substring(5,len-1);
//        char[] arr = leftLine.toCharArray();
//        int index = 0;
//        while((arr[index]>='0' && arr[index]<='9') || arr[index] == '-'){
//            index++;
//        }
//        if(index > 0){
//            opNum1 = Integer.parseInt(leftLine.substring(0,index));
//            //查询第二个值
//            int tempIndex = index+1 ;
//            while(tempIndex<=leftLine.length()-1 &&((arr[tempIndex]>='0' && arr[tempIndex]<='9') || arr[tempIndex] == '-')){
//                tempIndex++;
//            }
//            if(tempIndex>index+1){
//                opNum2 = Integer.parseInt(leftLine.substring(index+1,tempIndex));
//            }else{
//                //去除调空格
//                opNum2 = lisp(leftLine.substring(index+1));
//            }
//        }else {
//            int lk = 0;
//            int rk = 0;
//            while (index < leftLine.length()) {
//                if (arr[index] == '(') {
//                    lk++;
//                } else if (arr[index] == ')') {
//                    rk++;
//                }
//                if (lk == rk && lk > 0) {
//                    break;
//                }
//                index++;
//            }
//            opNum1 = lisp(leftLine.substring(0, index + 1));
//
//            //去除调空格
//            //查询第二个值
//            int tempIndex = index+2 ;
//            while(tempIndex<=leftLine.length()-1 &&((arr[tempIndex]>='0' && arr[tempIndex]<='9') || arr[tempIndex] == '-')){
//                tempIndex++;
//            }
//            if(tempIndex>index+2){
//                opNum2 = Integer.parseInt(leftLine.substring(index+2,tempIndex));
//            }else{
//                //去除调空格
//                opNum2 = lisp(leftLine.substring(index+2));
//            }
//        }
//        switch (op){
//            case "mul":
//                return opNum1*opNum2;
//            case "add":
//                return opNum1 + opNum2 ;
//            case "sub":
//                return opNum1 - opNum2 ;
//            case "div":
//                if(opNum2 == 0){
//                    isError = true ;
//                    return 0;
//                }
//                if((opNum1^opNum2) < 0 && opNum1%opNum2 != 0){
//                    return  opNum1/opNum2 + 1;
//                }
//                return opNum1/opNum2;
//        }
//        return 0;
//    }
}
//(div (mul 3 (add 1 (div 5 7))) 2)

//(div (mul 3 (add 1 (div 5 7))) (div (mul 3 (add 1 (div 5 7))) 2))